﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace daDataLayer
{
    using daBase.Objects;

    /// <summary>
    /// Контроллер файлов
    /// </summary>
    public class FileController
    {
        // Одиночка
        private static FileController instance;

        // поддерживаемые расширения
        private List<string> extensions;

        // Файлы
        private List<string> filenames;

        // Путь и командная строка
        private string path;
        private string[] commandline;

        /// <summary>
        /// Инициализация допустимых расширений
        /// </summary>
        private void InitExtensions()
        {
            extensions = new List<string>();
            extensions.Add(".pas");
            extensions.Add(".dpr");
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        public FileController()
        {
            InitExtensions();
            filenames = new List<string>();
        }

        /// <summary>
        /// Единственный экземпляр контроллера
        /// </summary>
        public static FileController Instance
        {
            get
            {
                if (instance == null)
                    instance = new FileController();
                return instance;
            }
        }

        /// <summary>
        /// Список файлов
        /// </summary>
        public List<string> FileNames { get { return filenames; } }

        /// <summary>
        /// Добавление файла в список
        /// </summary>
        /// <param name="file">файл</param>
        private void AddFile(string FileName)
        {
            if ((File.GetAttributes(FileName) & FileAttributes.Directory) == FileAttributes.Directory)
                AddFolder(FileName);
            else if (!filenames.Contains(FileName) && (extensions.Contains(new FileInfo(FileName).Extension.ToLower())))
                filenames.Add(FileName);
        }

        /// <summary>
        /// Добавление всех файлов из директории в список
        /// </summary>
        /// <param name="folder">директория</param>
        private void AddFolder(string FolderName)
        {
            if (!Directory.Exists(FolderName))
                return;
            string[] folders = Directory.GetDirectories(FolderName);
            foreach (string folder in folders)
                AddFolder(folder);
            string[] files = Directory.GetFiles(FolderName);
            foreach (string file in files)
                AddFile(file);
        }

        /// <summary>
        /// Добавление файла/директории в список
        /// </summary>
        /// <param name="filename">файл/директория</param>
        public void Add(string FileName)
        {
            if (Directory.Exists(FileName) && ((File.GetAttributes(FileName) & FileAttributes.Directory) == FileAttributes.Directory))
                AddFolder(FileName);
            else if (File.Exists(FileName))
                AddFile(FileName);
        }

        /// <summary>
        /// Очистить список файлов
        /// </summary>
        public void Clear()
        {
            filenames.Clear();
        }

        /// <summary>
        /// Удалить файл из списка
        /// </summary>
        /// <param name="filename">имя файла</param>
        public void Remove(string FileName)
        {
            filenames.Remove(FileName);
        }

        /// <summary>
        /// Инициализация командной строки
        /// </summary>
        /// <param name="StartupPath">стартовая директори</param>
        /// <param name="CommandLine">командная строка</param>
        /// <returns>результат инициализации</returns>
        public bool InitCommandLine(string StartupPath, string[] CommandLine)
        {
            if (this.commandline == null)
            {
                path = StartupPath;
                commandline = CommandLine;
                return true;
            }
            else return false;
        }

        /// <summary>
        /// Стартовая директория
        /// </summary>
        public string StartupPath { get { return path; } }

        /// <summary>
        /// Командная строка
        /// </summary>
        public string[] CommandLine { get { return commandline; } }
    }
}
